Métodos de Predictivos (Clasificación o Aprendizaje-Supervisado)
Se necesita cargar las siguientes librerías
Muestra la distribución de la variable a predecir
equilibrio.variable.predecir<-function(datos,variable.predecir,ylab="Cantidad de individuos",xlab = "",
main=paste("Distribución de la variable",variable.predecir),
col = NA) {
gg_color <- function (n) {
hues <- seq(15, 375, length = n + 1)
hcl(h = hues, l = 65, c = 100)[1:n]
}
if(missing(variable.predecir) | !(variable.predecir %in% colnames(datos))){
stop("variable.predecir tiene que ser ingresada y ser un nombre de columna", call. = FALSE )
}
if(is.character(datos[,variable.predecir]) | is.factor(datos[,variable.predecir])){
if(length(col) == 0 || is.na(col)){
col <- gg_color(length(unique(datos[,variable.predecir])))
}else{
col <- rep(col,length(unique(datos[,variable.predecir])))
}
ggplot(data = datos, mapping = aes_string(x = variable.predecir, fill = variable.predecir)) +
geom_bar() +
scale_fill_manual(values = col, name = variable.predecir) +
labs(x = xlab, y = ylab, title = main) +
theme_minimal() +
theme(legend.position = "bottom")
}else{
stop("La variable a predecir tienen que ser de tipo factor o character", call. = FALSE )
}
}Muestra la distribución de una variable numérica según la variable a predecir
poder.predictivo.numerica<-function(datos,variable.predecir,variable.comparar,ylab="",xlab="",
main=paste("Densidad de la variable",variable.comparar,'según',variable.predecir),
col=NA){
gg_color <- function (n) {
hues <- seq(15, 375, length = n + 1)
hcl(h = hues, l = 65, c = 100)[1:n]
}
if(missing(variable.predecir) | !(variable.predecir %in% colnames(datos))){
stop("variable.predecir tiene que ser ingresada y ser un nombre de columna", call. = FALSE )
}
if(missing(variable.comparar) | !(variable.comparar %in% colnames(datos)) | !is.numeric(datos[,variable.comparar])){
stop("variable.comparar tiene que ser ingresada y ser un nombre de columna numérica", call. = FALSE )
}
if(is.character(datos[,variable.predecir]) | is.factor(datos[,variable.predecir])){
if(length(col) == 0 || is.na(col)){
col <- gg_color(length(unique(datos[,variable.predecir])))
}else{
col <- rep(col,length(unique(datos[,variable.predecir])))
}
ggplot(data = datos, aes_string(variable.comparar, fill = variable.predecir)) +
geom_density(alpha = .7, color = NA) +
scale_fill_manual(values = col) +
labs(title = main , y = ylab, x = xlab ,fill = variable.predecir) +
theme_minimal() +
theme(legend.position = 'bottom',
legend.title = element_blank(),
text = element_text(size = 15))
}else{
stop("La variable a predecir tienen que ser de tipo factor o character", call. = FALSE )
}
}Muestra la distribución de una variable categórica según la variable a predecir
poder.predictivo.categorica<-function(datos,variable.predecir,variable.comparar,ylab="",xlab="",
main=paste("Densidad de la variable",variable.comparar,'según',variable.predecir),
col=NA){
gg_color <- function (n) {
hues <- seq(15, 375, length = n + 1)
hcl(h = hues, l = 65, c = 100)[1:n]
}
if(missing(variable.predecir) | !(variable.predecir %in% colnames(datos))){
stop("variable.predecir tiene que ser ingresada y ser un nombre de columna", call. = FALSE )
}
if(missing(variable.comparar) | !(variable.comparar %in% colnames(datos)) |
!(is.factor(datos[,variable.comparar]) | is.character(datos[,variable.comparar])) ){
stop("variable.comparar tiene que ser ingresada y ser un nombre de columna categórica", call. = FALSE )
}
if(is.character(datos[,variable.predecir]) | is.factor(datos[,variable.predecir])){
if(length(col) == 0 || is.na(col)){
col <- gg_color(length(unique(datos[,variable.predecir])))
}else{
col <- rep(col,length(unique(datos[,variable.predecir])))
}
datos2 <- datos %>%
dplyr::group_by_(variable.comparar, variable.predecir) %>%
dplyr::summarise(count = n())
if(variable.comparar != variable.predecir){
datos2 <- datos2 %>% dplyr::group_by_(variable.comparar)
}
datos2 <- datos2 %>% dplyr::mutate(prop = round(count/sum(count),4))
ggplot(data = datos2, mapping = aes_string(x = variable.comparar, y = "prop", fill = variable.predecir)) +
geom_col(position = "fill") +
geom_text(aes(label = glue("{percent(prop)} ({count})")), position = position_stack(vjust = .5), color = "white") +
scale_y_continuous(label = percent) +
labs(y = xlab, x = ylab, title = main) +
scale_fill_manual(values = col, name = variable.predecir) +
theme(legend.position = "bottom")+
coord_flip()
}else{
stop("La variable a predecir tienen que ser de tipo factor o character", call. = FALSE )
}
}Índices para matrices NxN
indices.general <- function(MC) {
precision.global <- sum(diag(MC))/sum(MC)
error.global <- 1 - precision.global
precision.categoria <- diag(MC)/rowSums(MC)
res <- list(matriz.confusion = MC, precision.global = precision.global, error.global = error.global,
precision.categoria = precision.categoria)
names(res) <- c("Matriz de Confusión", "Precisión Global", "Error Global",
"Precisión por categoría")
return(res)
}Cuando usamos el paquete “neuralnet” hay que hacer una preparación de los datos extra.
setwd("~/Desktop/Datos/")
datos <- read.csv("MuestraCredito5000V2.csv",sep = ";",header=T)
muestra <- sample(1:nrow(datos), floor(nrow(datos)*0.15)) # creamos una muestra
# Recodifica las variables como categóricas sin ordenar
datos$IngresoNeto <- factor(datos$IngresoNeto)
datos$CoefCreditoAvaluo <- factor(datos$CoefCreditoAvaluo)'data.frame': 5000 obs. of 6 variables:
$ MontoCredito : int 14327 111404 21128 15426 10351 27060 243369 16300 18319 107037 ...
$ IngresoNeto : Factor w/ 2 levels "1","2": 1 1 1 2 1 1 1 2 2 2 ...
$ CoefCreditoAvaluo: Factor w/ 12 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
$ MontoCuota : Factor w/ 4 levels "Alto","Bajo",..: 4 4 4 4 4 4 4 4 4 4 ...
$ GradoAcademico : Factor w/ 2 levels "Bachiller","Licenciatura": 1 1 1 1 1 1 1 1 1 1 ...
$ BuenPagador : Factor w/ 2 levels "No","Si": 2 2 2 2 2 2 2 2 2 2 ...
Se cargan las librerías
Las variables categóricas se deben pasar a dummy y luego se tienen que escalar los datos, excepto la variable a predecir
datos.aux <- datos
datos.aux <- cbind(dummy.data.frame(datos.aux[, -6]), datos.aux[6])
datos.aux[, -22] <- scale(datos.aux[, -22])
datos.auxEn este caso BuenPagador tiene valores de No y Si, por lo que hay que arreglar estos valores para que sean valores 0 y 1
Vamos a generar al azar una tabla de testing con 15% de los datos y una tabla de aprendizaje con 85%
Se genera el modelo
# Obtenemos fórmula
nombres <- colnames(datos.aux)
formula <- as.formula(paste("BuenPagador ~", paste(nombres[!nombres %in% c("BuenPagador")],
collapse = " + ")))
formulaBuenPagador ~ MontoCredito + IngresoNeto1 + IngresoNeto2 + CoefCreditoAvaluo1 +
CoefCreditoAvaluo2 + CoefCreditoAvaluo3 + CoefCreditoAvaluo4 +
CoefCreditoAvaluo5 + CoefCreditoAvaluo6 + CoefCreditoAvaluo7 +
CoefCreditoAvaluo8 + CoefCreditoAvaluo9 + CoefCreditoAvaluo10 +
CoefCreditoAvaluo11 + CoefCreditoAvaluo12 + MontoCuotaAlto +
MontoCuotaBajo + MontoCuotaMedio + MontoCuotaMuyBajo + GradoAcademicoBachiller +
GradoAcademicoLicenciatura
modelo <- neuralnet(formula, data = taprendizaje2, hidden = c(6, 4, 3),
linear.output = FALSE, threshold = 0.2, stepmax = 1e+06)Se genera la predicción
# Se usa compute para predecir, la variable a predecir está en la columna 22 por eso se quita
prediccion <- neuralnet::compute(modelo, ttesting2[, -22])$net.result
prediccion <- as.numeric(round(prediccion, digits = 0))
prediccion [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1
[36] 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1
[71] 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 1 1 1 0 1 0 1 0 1 1 1 0 1
[106] 0 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[141] 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1
[176] 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1
[211] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[246] 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 0 1 0 1 1
[281] 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[316] 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 0 0 1 1 1 0 1 1 1 0
[351] 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0 1
[386] 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[421] 1 1 0 1 0 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1
[456] 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[491] 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 1
[526] 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1
[561] 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1
[596] 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1
[631] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1
[666] 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[701] 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1
[736] 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1
Para obtener las clases podemos hacer lo siguiente:
[1] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[15] "No" "Si" "No" "Si" "Si" "Si" "Si" "Si" "Si" "No" "Si" "Si" "Si" "Si"
[29] "Si" "Si" "Si" "No" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "No" "Si"
[43] "Si" "Si" "Si" "No" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[57] "Si" "Si" "Si" "No" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[71] "No" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[85] "Si" "No" "Si" "Si" "Si" "No" "No" "Si" "Si" "Si" "Si" "No" "Si" "No"
[99] "Si" "No" "Si" "Si" "Si" "No" "Si" "No" "Si" "Si" "Si" "Si" "Si" "No"
[113] "No" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[127] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[141] "Si" "Si" "No" "Si" "Si" "Si" "Si" "No" "Si" "No" "Si" "Si" "Si" "Si"
[155] "Si" "Si" "No" "Si" "Si" "Si" "No" "Si" "Si" "Si" "Si" "Si" "No" "Si"
[169] "Si" "No" "Si" "Si" "Si" "Si" "Si" "No" "Si" "Si" "Si" "Si" "Si" "Si"
[183] "No" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "No" "Si" "Si"
[197] "Si" "Si" "Si" "No" "No" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[211] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[225] "Si" "Si" "Si" "No" "Si" "No" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[239] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[253] "No" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[267] "Si" "Si" "Si" "No" "Si" "No" "Si" "Si" "Si" "No" "Si" "No" "Si" "Si"
[281] "Si" "Si" "Si" "Si" "Si" "Si" "No" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[295] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[309] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "No"
[323] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "No" "No" "Si" "Si"
[337] "No" "Si" "Si" "Si" "No" "No" "Si" "Si" "Si" "No" "Si" "Si" "Si" "No"
[351] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "No"
[365] "No" "Si" "Si" "Si" "Si" "Si" "Si" "No" "No" "Si" "Si" "Si" "Si" "Si"
[379] "Si" "Si" "Si" "Si" "Si" "No" "Si" "No" "Si" "Si" "No" "Si" "Si" "Si"
[393] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "No" "Si" "No" "Si" "Si" "Si" "Si"
[407] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[421] "Si" "Si" "No" "Si" "No" "Si" "Si" "No" "Si" "Si" "No" "Si" "Si" "Si"
[435] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[449] "No" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "No" "Si"
[463] "Si" "Si" "No" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[477] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[491] "No" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "No" "No" "Si" "Si" "Si" "Si"
[505] "Si" "Si" "Si" "Si" "No" "Si" "Si" "Si" "Si" "No" "Si" "Si" "Si" "Si"
[519] "Si" "Si" "No" "No" "Si" "Si" "Si" "No" "Si" "Si" "Si" "Si" "Si" "Si"
[533] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "No" "Si" "No"
[547] "Si" "Si" "Si" "No" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[561] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "No" "Si" "Si" "Si" "Si" "Si" "Si"
[575] "Si" "No" "Si" "Si" "Si" "No" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[589] "No" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "No" "Si" "Si" "Si" "Si"
[603] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[617] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "No" "No" "Si" "Si" "Si"
[631] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[645] "Si" "Si" "Si" "No" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "No" "Si" "Si"
[659] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[673] "Si" "No" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[687] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si"
[701] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "No" "Si"
[715] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "No" "Si" "Si" "Si" "Si" "Si"
[729] "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "Si" "No" "Si" "Si" "Si" "Si"
[743] "Si" "Si" "Si" "Si" "No" "Si" "Si" "Si"
Se genera la matriz de confusión
real No Si
No 79 31
Si 8 632
Índices de calidad de la predicción
$`Matriz de Confusión`
real No Si
No 79 31
Si 8 632
$`Precisión Global`
[1] 0.948
$`Error Global`
[1] 0.052
$`Precisión por categoría`
No Si
0.7181818 0.9875000
Se cargan las librerías
Vamos a generar al azar una tabla de testing con 15% de los datos y una tabla de aprendizaje con 85%
Se genera el modelo
modelo <- train.neuralnet(BuenPagador ~., data = taprendizaje, hidden = c(6, 4, 3),
linear.output = FALSE, threshold = 0.2, stepmax = 1e+06)Se genera la predicción
[1] Si Si Si Si Si Si Si Si Si Si Si Si Si Si No Si No Si Si Si Si Si Si
[24] No Si Si Si Si Si Si Si No Si Si Si Si Si Si Si Si No Si Si Si Si No
[47] Si Si Si Si Si Si Si Si Si Si Si Si Si No Si Si Si Si Si Si Si Si Si
[70] Si No Si Si Si Si Si Si Si Si Si Si Si Si Si Si No Si Si Si No No Si
[93] Si Si Si No Si No Si No Si Si Si No Si No Si Si Si Si Si No No Si Si
[116] Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si
[139] Si Si Si Si No Si Si Si Si No Si No Si Si Si Si Si Si No Si Si Si No
[162] Si Si Si Si Si No Si Si No Si Si Si Si Si No Si Si Si Si Si Si No Si
[185] Si Si Si Si Si Si Si Si Si No Si Si Si Si Si No No Si Si Si Si Si Si
[208] Si Si No Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si No Si No
[231] Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si No
[254] Si Si Si No Si Si Si Si Si Si Si Si Si Si Si No No Si No Si Si Si No
[277] Si No Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si No Si Si Si Si
[300] Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si No
[323] Si Si Si Si Si Si Si Si Si Si No No Si Si No Si Si Si Si No Si Si Si
[346] No Si No Si No Si Si Si Si Si Si Si Si Si Si Si Si Si No No No Si Si
[369] Si Si Si No No Si Si Si Si Si Si Si Si Si Si No Si No Si Si No Si Si
[392] Si Si Si Si Si Si Si Si No Si No Si No Si Si Si Si Si Si Si Si Si Si
[415] Si Si Si Si Si Si Si Si No Si Si Si Si No Si Si No Si Si Si Si Si Si
[438] Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si
[461] No Si Si Si No Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si
[484] Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si No No Si Si Si Si Si Si
[507] Si Si No Si Si Si Si No Si Si Si Si No Si No No Si Si Si No Si Si No
[530] Si Si Si Si Si Si Si Si Si Si Si Si Si Si No Si No Si Si Si Si Si Si
[553] Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si No Si Si Si Si Si Si Si
[576] No Si Si Si Si Si Si Si Si Si Si Si Si No Si Si Si Si Si Si Si Si No
[599] Si Si Si Si Si Si Si Si Si Si Si Si Si No Si Si Si Si Si Si Si Si Si
[622] Si Si Si Si No No Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si
[645] Si Si Si No Si Si Si Si Si Si Si No Si Si Si Si Si Si Si Si Si Si Si
[668] Si Si Si No Si Si No Si Si Si Si Si Si Si No Si Si Si Si Si Si Si Si
[691] Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si
[714] Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si Si
[737] Si No Si Si Si Si Si Si Si Si No Si Si Si
Levels: No Si
Se genera la matriz de confusión
prediction
real No Si
No 77 33
Si 13 627
Índices de calidad de la predicción
Confusion Matrix:
prediction
real No Si
No 77 33
Si 13 627
Overall Accuracy: 0.9387
Overall Error: 0.0613
Category Accuracy:
No Si
0.700000 0.979688
Podemos omitir crear la matriz de confusión
Confusion Matrix:
prediction
real No Si
No 77 33
Si 13 627
Overall Accuracy: 0.9387
Overall Error: 0.0613
Category Accuracy:
No Si
0.700000 0.979688
setwd("~/Desktop/Datos/")
datos<-read.csv("iris.csv",sep = ";",dec='.',header=T)
muestra <- sample(1:nrow(datos), 50) # Creamos una muestra
datos'data.frame': 150 obs. of 5 variables:
$ s.largo: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ s.ancho: num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ p.largo: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ p.ancho: num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ tipo : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
Se cargan las librerías
Las variables categóricas se deben pasar a dummy y luego se tienen que escalar los datos, excepto la variable a predecir
datos.aux <- datos
datos.aux <- cbind(dummy.data.frame(datos.aux[, -5]), datos.aux[5])
datos.aux[, -5] <- scale(datos.aux[, -5])Hay que convertir la variable a predecir a dummy pero manteniendo los nombres de las clases
datos.aux <- datos.aux %>% dplyr::mutate(.valor.nuevo = TRUE, i = row_number()) %>%
tidyr::spread(key = "tipo", value = '.valor.nuevo', fill = FALSE) %>%
dplyr::select(-i)
datos.auxVamos a generar al azar una tabla de testing de tamaño 50 y una tabla de aprendizaje de tamaño 100
Se genera el modelo
# Obtenemos fórmula
nombres <- colnames(datos.aux)
clases <- levels(datos$tipo)
formula <- as.formula(paste0( paste0(paste0("`",clases,"`", collapse = "+" ),"~", paste(nombres[!nombres %in% clases],
collapse = " + "))))
formulasetosa + versicolor + virginica ~ s.largo + s.ancho + p.largo +
p.ancho
modelo <- neuralnet(formula, data = taprendizaje2, hidden = c(6, 4, 3),
linear.output = FALSE, threshold = 0.01, stepmax = 1e+06)Se genera la predicción
[,1] [,2] [,3]
134 6.978840e-04 0.980203134 8.645087e-03
60 7.162085e-04 0.980473548 8.405043e-03
130 7.165928e-08 0.014299109 9.931410e-01
34 9.994013e-01 0.001754813 1.188349e-05
57 5.792360e-04 0.976784000 1.051307e-02
104 9.723415e-05 0.896419773 6.562208e-02
27 9.994027e-01 0.001751611 1.185040e-05
89 6.073543e-04 0.977712612 1.000342e-02
113 8.084847e-08 0.015886860 9.922144e-01
50 9.994037e-01 0.001749406 1.182759e-05
142 7.258789e-08 0.014460800 9.930476e-01
26 9.994026e-01 0.001751998 1.185444e-05
30 9.994026e-01 0.001751896 1.185337e-05
91 7.201494e-04 0.980439018 8.350479e-03
87 6.107260e-04 0.977821090 9.945640e-03
126 7.182061e-04 0.980457777 8.377321e-03
51 9.994037e-01 0.001749547 1.182905e-05
86 7.921451e-08 0.015606482 9.923795e-01
92 7.109935e-04 0.980447606 8.474437e-03
149 7.282630e-08 0.014502267 9.930236e-01
20 9.994023e-01 0.001752679 1.186148e-05
128 7.178335e-08 0.014320729 9.931285e-01
53 6.775064e-04 0.979720646 8.919731e-03
15 9.994015e-01 0.001754349 1.187883e-05
132 7.600648e-08 0.015053599 9.927032e-01
103 1.150222e-07 0.021586463 9.887344e-01
47 1.260000e-07 0.023359941 9.876079e-01
8 9.993988e-01 0.001760292 1.194110e-05
108 7.134045e-08 0.014243526 9.931731e-01
114 7.107282e-04 0.980441723 8.477763e-03
123 7.751846e-08 0.015314581 9.925507e-01
79 7.125515e-08 0.014228650 9.931816e-01
145 7.256616e-08 0.014457020 9.930498e-01
112 7.193520e-04 0.980447767 8.361503e-03
39 9.994033e-01 0.001750302 1.183683e-05
110 7.159793e-08 0.014288416 9.931472e-01
78 7.145585e-08 0.014263649 9.931615e-01
17 7.189717e-04 0.980451411 8.367087e-03
109 7.435289e-08 0.014767337 9.928699e-01
32 9.994032e-01 0.001750659 1.184055e-05
83 7.624042e-08 0.015094025 9.926796e-01
63 7.170699e-04 0.980467123 8.393191e-03
143 7.491740e-08 0.014865161 9.928130e-01
105 7.354147e-08 0.014626542 9.929516e-01
10 9.994000e-01 0.001757696 1.191391e-05
137 7.309638e-08 0.014549217 9.929964e-01
45 9.994038e-01 0.001749351 1.182705e-05
65 6.446064e-07 0.092229321 9.340864e-01
133 7.230534e-08 0.014411633 9.930760e-01
98 7.179650e-04 0.980460285 8.380694e-03
Para obtener las clases podemos hacer lo siguiente:
[1] "versicolor" "versicolor" "virginica" "setosa" "versicolor"
[6] "versicolor" "setosa" "versicolor" "virginica" "setosa"
[11] "virginica" "setosa" "setosa" "versicolor" "versicolor"
[16] "versicolor" "setosa" "virginica" "versicolor" "virginica"
[21] "setosa" "virginica" "versicolor" "setosa" "virginica"
[26] "virginica" "virginica" "setosa" "virginica" "versicolor"
[31] "virginica" "virginica" "virginica" "versicolor" "setosa"
[36] "virginica" "virginica" "versicolor" "virginica" "setosa"
[41] "virginica" "versicolor" "virginica" "virginica" "setosa"
[46] "virginica" "setosa" "virginica" "virginica" "versicolor"
Se genera la matriz de confusión
real setosa versicolor virginica
setosa 12 1 1
versicolor 1 9 5
virginica 0 5 16
Índices de calidad de la predicción
$`Matriz de Confusión`
real setosa versicolor virginica
setosa 12 1 1
versicolor 1 9 5
virginica 0 5 16
$`Precisión Global`
[1] 0.74
$`Error Global`
[1] 0.26
$`Precisión por categoría`
setosa versicolor virginica
0.8571429 0.6000000 0.7619048
Se cargan las librerías
Vamos a generar al azar una tabla de testing de tamaño 50 y una tabla de aprendizaje de tamaño 100
Se genera el modelo
modelo <- train.neuralnet(tipo~., data = taprendizaje, hidden = c(6, 4, 3),
linear.output = FALSE, threshold = 0.01, stepmax = 1e+06)Se genera la predicción
[1] versicolor versicolor versicolor setosa versicolor versicolor
[7] setosa versicolor virginica setosa virginica setosa
[13] setosa versicolor versicolor versicolor versicolor versicolor
[19] versicolor virginica setosa versicolor versicolor setosa
[25] versicolor virginica setosa setosa versicolor virginica
[31] virginica versicolor virginica versicolor setosa virginica
[37] versicolor setosa virginica setosa versicolor versicolor
[43] versicolor virginica setosa virginica setosa versicolor
[49] virginica versicolor
Levels: setosa versicolor virginica
Se genera la matriz de confusión
prediction
real setosa versicolor virginica
setosa 14 0 0
versicolor 0 15 0
virginica 0 9 12
Índices de calidad de la predicción
Confusion Matrix:
prediction
real setosa versicolor virginica
setosa 14 0 0
versicolor 0 15 0
virginica 0 9 12
Overall Accuracy: 0.8200
Overall Error: 0.1800
Category Accuracy:
setosa versicolor virginica
1.000000 1.000000 0.571429
Podemos omitir crear la matriz de confusión
Confusion Matrix:
prediction
real setosa versicolor virginica
setosa 14 0 0
versicolor 0 15 0
virginica 0 9 12
Overall Accuracy: 0.8200
Overall Error: 0.1800
Category Accuracy:
setosa versicolor virginica
1.000000 1.000000 0.571429